import config from '@/config'
import {
  getToken
} from '@/utils/auth'
/**
 * POST请求下载文件
 * @param {string} url - 请求的URL (不含域名)
 * @param {object} params - POST请求的参数 (JSON对象)
 * @param {string} fileName - 下载后期望的文件名
 */
function postDownload(url, params, fileName) {
  uni.showLoading({
    title: '正在生成文件...',
    mask: true
  });
  // 是否需要设置 token
  const isToken = (config.headers || {}).isToken === false
  config.header = config.header || {}
  if (getToken() && !isToken) {
    config.header['Authorization'] = 'Bearer ' + getToken()
  }
  // #ifdef H5
  // H5端的实现
  uni.request({
    url: config.baseUrl + url,
    method: 'POST',
    header: config.header,
    data: params,
    responseType: 'arraybuffer', // 关键：H5端接收二进制大对象
    success: (res) => {
      if (res.statusCode === 200) {
        // 检查返回内容类型
        const contentType = res.header['content-type'] || res.header['Content-Type'];
        // 判断是否为Excel
        if (contentType && contentType.indexOf('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') !== -1) {
          const blob = new Blob([res.data], {
            type: contentType
          });
          const a = document.createElement('a');
          a.download = fileName;
          a.href = URL.createObjectURL(blob);
          document.body.appendChild(a);
          a.click();
          document.body.removeChild(a);
          URL.revokeObjectURL(a.href);
        } else {
          // 可能是后端返回了错误信息（JSON），需要转成字符串看看
          const decoder = new TextDecoder('utf-8');
          const text = decoder.decode(res.data);
          console.error('后端返回内容：', text);
          uni.showToast({
            title: '下载失败，后端返回错误',
            icon: 'none'
          });
        }
      } else {
        uni.showToast({
          title: '下载失败',
          icon: 'none'
        });
      }
    },
    fail: (err) => {
      uni.showToast({
        title: '请求失败',
        icon: 'none'
      });
    },
    complete: () => {
      uni.hideLoading();
    }
  });
  // #endif

  // #ifdef APP-PLUS
  // App端的实现
  uni.request({
    url: url,
    method: 'POST',
    data: params,
    responseType: 'arraybuffer', // 关键：App端接收原始二进制数据
    success: (res) => {
      if (res.statusCode === 200) {
        const fs = uni.getFileSystemManager();
        // 定义一个临时文件路径
        const filePath = `${uni.env.USER_DATA_PATH}/${fileName}`;

        fs.writeFile({
          filePath: filePath,
          data: res.data,
          encoding: 'binary',
          success: () => {
            uni.hideLoading();
            // 保存成功后，提示用户并尝试打开文件
            uni.showToast({
              title: '文件已保存，正在打开',
              icon: 'none',
              duration: 2000
            });
            uni.openDocument({
              filePath: filePath,
              showMenu: true, // for iOS, show menu to forward/save
              fail: () => {
                uni.showToast({
                  title: '打开失败，请检查是否安装了WPS或Office应用',
                  icon: 'none'
                });
              }
            });
          },
          fail: () => {
            uni.hideLoading();
            uni.showToast({
              title: '文件保存失败',
              icon: 'none'
            });
          }
        });
      } else {
        uni.hideLoading();
        uni.showToast({
          title: '下载失败',
          icon: 'none'
        });
      }
    },
    fail: (err) => {
      uni.hideLoading();
      uni.showToast({
        title: '请求失败',
        icon: 'none'
      });
    }
  });
  // #endif
}

export default postDownload